# _*_ coding:utf-8 _*_
#__author__ = 'Ada'

'''
定义对MySQL数据库基本操作的封装
1. 包括基本的单条语句操作，如删除、修改、更新
2. 独立地 查询单条、多条数据
3. 独立地添加多条数据
'''

import pymysql
from util.getlog import get_log
import time
from configs import globalVariables

class OperationDbInterface(object):
    #初始化数据库连接
    def __init__(self,host_db='10.231.32.20', user_db='guoliming', passwd_db='laoguolaoguo110', name_db='ssc_hrwork_test', port_db=3306,link_type=0):
        '''
        :param host_db: 数据库服务器主机
        :param user_db: 数据库用户名
        :param passwd_db: 数据库密码
        :param name_db: 数据库名称
        :param port_db: 端口号，整型数据
        :param link_type: 连接类型，用于设置输出数据是元祖还是字典，默认是字典，link_type = 0
        '''

        try:
            if link_type == 0:
                self.conn = pymysql.connect(host = host_db, user = user_db, passwd = passwd_db, db = name_db, port = port_db, charset = 'utf8', cursorclass= pymysql.cursors.DictCursor) #创建数据库连接，返回字典
            else:
                self.conn = pymysql.connect(host = host_db, user = user_db, passwd = passwd_db, db = name_db, port = port_db, charset = 'utf8')  # 创建数据库连接，返回元组
            self.cur = self.conn.cursor()
        except pymysql.Error as e:
            globalVariables.logger.error("创建数据库连接失败 Mysql Error %d: %s" % (e.args[0], e.args[1]))

    #定义单条数据操作，包含删除、更新操作
    def op_sql(self,condition):
        '''
        :param condition: SQL语句，该通用方法可用来替代updateone,deleteone
        :return: 字典形式
        '''
        try:
            self.cur.execute(condition)#执行SQL语句
            self.conn.commit#提价游标数据
            result={'code':'0000', 'message':'执行通用操作成功', 'data':[]}
        except pymysql.Error as e:
            self.conn.rollback()#执行回滚操作
            result={'code':'9999', 'message':'执行通用操作异常', 'data':[]}
            globalVariables.logger.error("数据库错误 op_sql %d: %s" % (e.args[0], e.args[1]))
        return result

    #查询表中单条数据
    def select_one(self,condition, param = None):
        '''
        :param condition: #SQL语句
        :return: 字典形式单条查询结果
        '''

        try:
            if param is not None:
                rows_affect = self.cur.execute(condition, param)
            else:
                rows_affect = self.cur.execute(condition)
            print("rows_affect",rows_affect)
            if rows_affect > 0: #查询结果返回数据大于0
                results = self.cur.fetchone() #获取一条结果
                result = {'code':'0000', 'message':'执行单条查询操作成功', 'data':results}
            else:
                result = {'code':'0000', 'message':'执行单条查询操作成功', 'data':[]}
        except pymysql.Error as e:
            self.conn.rollback() #执行回滚操作
            result = {'code':'9999', 'message':'执行单条查询异常', 'data':[]}
            globalVariables.logger.error("数据库错误 select one %d: %s" % (e.args[0], e.args[1]))
        return result


    # 查询表中多条数据
    def select_all(self, condition, param = None):
        '''
        :param condition: SQL语句
        :return: 字典形式的批量查询结果
        '''
        try:
            if param is not None:
                rows_affect = self.cur.execute(condition,param)
                # print('rows_affect',rows_affect)
            else:
                rows_affect = self.cur.execute(condition)
            if rows_affect >0: #查询结果返回数据数大于0
                self.cur.scroll(0,mode = 'absolute') #将鼠标光标放回到初始位置
                results = self.cur.fetchall() #返回游标中所有结果
                result = {'code':'0000', 'message':'执行批量查询操作成功', 'data':results}
            else:
                result = {'code': '0000', 'message': '执行批量查询操作成功', 'data': []}
        except pymysql.Error as e:
            self.conn.rollback() #执行回滚操作
            result = {'code':'9999', 'message':'执行批量查询异常', 'data':[]}
            globalVariables.logger.error('数据库错误 select_all %d: %s' %(e.args[0], e.args[1]))
        return result

    # 定义表中插入数据操作
    def insert_data(self, condition, params):
        '''

        :param condition: insert语句
        :param params: insert 数据，列表形式[('3','Tom','1 year 1 class', '6'), ('3','Jack','2 year 1 class', '7'),]
        :return: #字典形式的批量插入数据结果
        '''
        try:
            results = self.cur.executemany(condition, params) #返回插入的数据条数
            self.conn.commit()
            result = {'code': '0000', 'message': '执行批量插入数据操作成功', 'data': results}
        except pymysql.Error as e:
            self.conn.rollback() #执行回滚操作
            result = {'code': '9999', 'message': '执行批量插入异常', 'data': []}
            globalVariables.logger.error("数据库错误 insert_more %d: %s" %(e.args[0], e.args[1]))
        return result

    # 关闭数据库
    def __del__(self):
        if self.cur != None:
            self.cur.close() #关闭游标
        if self.conn != None:
            self.conn.close() #释放数据库资源

if __name__ == '__main__':
    test = OperationDbInterface() #实例化类

    courseName = "自动化测试_1629378918"

    result_select_all = test.select_one("select sbc.id from sh_business_course_info sbc where sbc.course_name = %s", courseName) #查询多条数据
    result_select_one = test.select_one("select * from ssc_hrwork_test.sh_emp_basic") #查询单条数据

    print(result_select_one)
    print(result_select_all)
    #result_op_sql = test.op_sql()



'''
Python操作M有SQL数据库流程：
1. 创建数据库连接： Conn = pymysql.connect()
2. 创建游标： Cur = Conn.cursor()
注：创建游标：即将受影响的数据暂时存放到一个内存区域的虚表中，而这个虚表就是游标。为什么要建立游标呢？目的是为了回滚。此时将对数据库的操作暂时存放在游标中，只要不提交，就可以对游标中的内容进行回滚。
3. 在游标下执行SQL语句： Cur.execute(sql)
4. 提交游标数据到数据库： Conn.commit()
5. 关闭游标： Cur.close()
6. 关键数据库连接： Conn.close()
'''